package com.etoak.tool;

import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.etoak.entity.Point;
import com.etoak.entity.Position;
import com.graphhopper.GHRequest;
import com.graphhopper.GHResponse;
import com.graphhopper.GraphHopper;
import com.graphhopper.ResponsePath;
import com.graphhopper.config.CHProfile;
import com.graphhopper.config.Profile;
import com.graphhopper.util.PointList;

import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;

/**
 * 位置工具类，用于处理位置数据
 */
public class PositionTool {

    /**
     * 判断position是否正常
     *
     * @param position
     * @return
     */
    public static boolean positionIsTrue(Position position) {

        // 判断position是否为空
        if (position == null) {
            return false;
        }

        // 判断position经纬度是否正常
        if (position.getLon() < 121.5908 || position.getLon() > 121.6561656) {
            return false;
        }

        if (position.getLat() < 29.8962593 || position.getLat() > 29.9395264) {
            return false;
        }

        // 判断时间是否为空
        if (null == position.getCreateTime()) {
            return false;
        }

        return true;
    }

    /**
     * 判断position列表是否都正常
     *
     * @param positions
     * @return
     */
    public static boolean positionIsTrue(List<Position> positions) {

        for (Position position : positions) {
            if (!positionIsTrue(position)) {
                return false;
            }
        }

        return true;
    }

    /**
     * 生成路径
     *
     * @param positions   位置列表
     * @param trafficMode 交通方式配置
     * @return
     * @throws FileNotFoundException
     */
    public static List<Position> list(List<Position> positions, String trafficMode) throws FileNotFoundException {

        if (positions == null) {
            return null;
        }

        GraphHopper hopper = new GraphHopper();

        // OSM 文件路径
        hopper.setOSMFile("D:\\材料所项目-终版\\position\\src\\main\\resources\\osm\\map.osm");
        // 读取完OSM数据之后会构建路线图，此处配置图的存储路径
        hopper.setGraphHopperLocation("D:\\材料所项目-终版\\position\\src\\main\\resources\\mapdata");
        //hopper.load("D:\\材料所项目-终版\\position\\car.json");

        // 支持car、bike、foot三种交通方式的导航
        List<Profile> profiles = new ArrayList<>();
        profiles.add(new Profile("car").setVehicle("foot").setWeighting("fastest").setTurnCosts(false));
        profiles.add(new Profile("foot").setVehicle("foot").setWeighting("fastest").setTurnCosts(false));
        profiles.add(new Profile("bike").setVehicle("bike").setWeighting("shortest").setTurnCosts(false));
        hopper.setProfiles(profiles);

        // 加载地图数据
        hopper.importOrLoad();

        List<Position> pathWay = new ArrayList<>();

        // 对多途径点分别两两分组规划路径
        for (int i = 1; i < positions.size(); i++) {
            Position p = positions.get(i);
            Position p2 = positions.get(i - 1);

            // 如果是第一个点则手动添加至路径点
            if (i == 1) {
                pathWay.add(p);
            }

            // 获得起始点
            double startLat = p.getLat();
            double startLon = p.getLon();
            double endLat = p2.getLat();
            double endLon = p2.getLon();


            GHRequest req = new GHRequest(startLat, startLon, endLat, endLon)
                    .setProfile(trafficMode);
            GHResponse rsp = hopper.route(req);

            // 报错处理
            if (rsp.hasErrors()) {
                throw new RuntimeException(rsp.getErrors().toString());
            }

            // 使用最佳路径，请参阅GHResponse类以了解更多可能性。
            ResponsePath path = rsp.getBest();
            PointList pointList = path.getPoints();
            for (int j = 0; j < pointList.size(); ++j) {
                Position ja = new Position();
                ja.setLon(pointList.getLon(j));
                ja.setLat(pointList.getLat(j));
                // 生成的路径点使用起点的时间
                ja.setCreateTime(p.getCreateTime());
                pathWay.add(ja);
            }

            // 对两两分组的规划结果进行保存
            pathWay.add(p2);
        }
        // 返回最终结果
        return pathWay;
    }

}
